Cache the display name. There is only one GdkDisplay on Win32, and
authorTor Lillqvist <tml@novell.com>
Thu, 8 Sep 2005 22:45:40 +0000 (22:45 +0000)
committerTor Lillqvist <tml@src.gnome.org>
Thu, 8 Sep 2005 22:45:40 +0000 (22:45 +0000)
2005-09-09  Tor Lillqvist  <tml@novell.com>

* gdk/win32/gdkdisplay-win32.c (gdk_display_get_name): Cache the
display name. There is only one GdkDisplay on Win32, and
constructing the display name isn't entirely trivial, so cacheing
is probably worth it. For instance GIMP calls this function a lot.
(gdk_display_open): Call gdk_display_get_name() to prime the
cached name.
(gdk_display_get_n_screens, gdk_display_get_screen,
gdk_display_get_default_screen): Verify parameter correctness like
the X11 backend does.

* gdk/win32/gdkscreen-win32.c (gdk_screen_make_display_name):
Return a freshly allocated string, as the API specifies. Fixes a
heap corruption problem that caused random errors and crashes in
GIMP, for instance.

ChangeLog
ChangeLog.pre-2-10
gdk/win32/gdkdisplay-win32.c
gdk/win32/gdkscreen-win32.c

index 5f5d55d34815ff73933fc461ba5d0ff275b85ba4..4676c76c8f9d4254b97ea2563a3276479c6b58cd 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,20 @@
+2005-09-09  Tor Lillqvist  <tml@novell.com>
+
+       * gdk/win32/gdkdisplay-win32.c (gdk_display_get_name): Cache the
+       display name. There is only one GdkDisplay on Win32, and
+       constructing the display name isn't entirely trivial, so cacheing
+       is probably worth it. For instance GIMP calls this function a lot.
+       (gdk_display_open): Call gdk_display_get_name() to prime the
+       cached name.
+       (gdk_display_get_n_screens, gdk_display_get_screen,
+       gdk_display_get_default_screen): Verify parameter correctness like
+       the X11 backend does.
+
+       * gdk/win32/gdkscreen-win32.c (gdk_screen_make_display_name):
+       Return a freshly allocated string, as the API specifies. Fixes a
+       heap corruption problem that caused random errors and crashes in
+       GIMP, for instance.
+
 2005-09-07  Matthias Clasen  <mclasen@redhat.com>
 
        * gtk/gtkimcontextsimple.c (gtk_im_context_simple_filter_keypress): 
index 5f5d55d34815ff73933fc461ba5d0ff275b85ba4..4676c76c8f9d4254b97ea2563a3276479c6b58cd 100644 (file)
@@ -1,3 +1,20 @@
+2005-09-09  Tor Lillqvist  <tml@novell.com>
+
+       * gdk/win32/gdkdisplay-win32.c (gdk_display_get_name): Cache the
+       display name. There is only one GdkDisplay on Win32, and
+       constructing the display name isn't entirely trivial, so cacheing
+       is probably worth it. For instance GIMP calls this function a lot.
+       (gdk_display_open): Call gdk_display_get_name() to prime the
+       cached name.
+       (gdk_display_get_n_screens, gdk_display_get_screen,
+       gdk_display_get_default_screen): Verify parameter correctness like
+       the X11 backend does.
+
+       * gdk/win32/gdkscreen-win32.c (gdk_screen_make_display_name):
+       Return a freshly allocated string, as the API specifies. Fixes a
+       heap corruption problem that caused random errors and crashes in
+       GIMP, for instance.
+
 2005-09-07  Matthias Clasen  <mclasen@redhat.com>
 
        * gtk/gtkimcontextsimple.c (gtk_im_context_simple_filter_keypress): 
index fe08e4584149f316495fd7372964f7b41bc2f34b..49989485736ec56b22513bd969d0001a808e5a52 100644 (file)
@@ -236,6 +236,9 @@ gdk_display_open (const gchar *display_name)
   _gdk_input_init (_gdk_display);
   _gdk_dnd_init ();
 
+  /* Precalculate display name */
+  (void) gdk_display_get_name (_gdk_display);
+
   g_signal_emit_by_name (gdk_display_manager_get (),
                         "display_opened", _gdk_display);
 
@@ -253,9 +256,13 @@ gdk_display_get_name (GdkDisplay *display)
   HWINSTA hwinsta = GetProcessWindowStation ();
   char *window_station_name;
   DWORD n;
-  DWORD session_id;
   char *display_name;
-  const char *retval;
+  static const char *display_name_cache = NULL;
+
+  g_return_val_if_fail (GDK_IS_DISPLAY (display), NULL);
+  
+  if (display_name_cache != NULL)
+    return display_name_cache;
 
   n = 0;
   GetUserObjectInformation (hdesk, UOI_NAME, &dummy, 0, &n);
@@ -285,22 +292,22 @@ gdk_display_get_name (GdkDisplay *display)
        window_station_name = "WinSta0";
     }
 
-  display_name = g_strdup_printf ("%ld\\%s\\%s",
+  display_name = g_strdup_printf ("%d\\%s\\%s",
                                  get_session_id (), window_station_name,
                                  desktop_name);
 
-  retval = g_quark_to_string (g_quark_from_string (display_name));
-
-  g_free (display_name);
+  GDK_NOTE (MISC, g_print ("gdk_display_get_name: %s\n", display_name));
 
-  GDK_NOTE (MISC, g_print ("gdk_display_get_name: %s\n", retval));
+  display_name_cache = display_name;
 
-  return retval;
+  return display_name_cache;
 }
 
 gint
 gdk_display_get_n_screens (GdkDisplay *display)
 {
+  g_return_val_if_fail (GDK_IS_DISPLAY (display), 0);
+  
   return 1;
 }
 
@@ -308,12 +315,17 @@ GdkScreen *
 gdk_display_get_screen (GdkDisplay *display,
                        gint        screen_num)
 {
+  g_return_val_if_fail (GDK_IS_DISPLAY (display), NULL);
+  g_return_val_if_fail (screen_num != 0, NULL);
+
   return _gdk_screen;
 }
 
 GdkScreen *
 gdk_display_get_default_screen (GdkDisplay *display)
 {
+  g_return_val_if_fail (GDK_IS_DISPLAY (display), NULL);
+
   return _gdk_screen;
 }
 
index 91e3ff6a2fdd0acc9488e75c8b2a3fd8fb708a67..59b5430cdd9094d1ea4045d79357048878dec643 100644 (file)
@@ -115,5 +115,5 @@ _gdk_windowing_substitute_screen_number (const gchar *display_name,
 gchar *
 gdk_screen_make_display_name (GdkScreen *screen)
 {
-  return gdk_display_get_name (_gdk_display);
+  return g_strdup (gdk_display_get_name (_gdk_display));
 }